package com.guanyua.eims;

import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.IColumnType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author 任建波
 * @date 2019/9/6 16:41
 */
public class CodeGenerator {

    /**
     * 读取控制台内容
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + "：");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }

    /**
     * 生成器
     * @param projectName   项目名
     * @param packagePath   包名
     * @param author    作者
     */
    public static void generator(String projectName, String packagePath, String author) {
        // 自定义参数
        String projectPath = System.getProperty("user.dir") + File.separator + projectName;

        // 全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(projectPath + "/src/main/java");
        globalConfig.setAuthor(author);  //  作者
        globalConfig.setEnableCache(false);// XML 二级缓存
        globalConfig.setOpen(false);    // 是否打开输出目录 默认true
        globalConfig.setFileOverride(false); // 是否覆盖文件
        globalConfig.setBaseColumnList(false); // 基本的sql片段
        globalConfig.setBaseResultMap(false); // 基本的字段映射
        //         globalConfig.setEntityName("%sEntity");			//实体命名方式  默认值：null 例如：%sEntity 生成 UserEntity
        globalConfig.setMapperName("%sDao");    //  dao层
//        globalConfig.setXmlName("%sMapper");    //Mapper xml 命名方式   默认值：null 例如：%sDao 生成 UserDao.xml
        globalConfig.setServiceName("%sService");   //service 命名方式   默认值：null 例如：%sBusiness 生成 UserBusiness
//         globalConfig.setServiceImplName("%sServiceImpl");	//service impl 命名方式  默认值：null 例如：%sBusinessImpl 生成 UserBusinessImpl
//         globalConfig.setControllerName("%sController");	//controller 命名方式    默认值：null 例如：%sAction 生成 UserAction
        globalConfig.setDateType(DateType.ONLY_DATE);  //定义实体类中日期类型
        globalConfig.setSwagger2(true);    //   开启swagger2模式

        // 数据源配置
        DataSourceConfig dataSource = new DataSourceConfig();
        dataSource.setUrl("jdbc:mysql://47.93.0.165:3306/eims?&characterEncoding=utf8&useSSL=false&serverTimezone=UTC");
        dataSource.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSource.setUsername("root");
        dataSource.setPassword("2949501wbp");
        dataSource.setTypeConvert(new MySqlTypeConvert(){
            // 自定义数据库表字段类型转换【可选】
            @Override
            public IColumnType processTypeConvert(GlobalConfig globalConfig, String fieldType) {
                if ( fieldType.toLowerCase().contains( "datetime" ) ) {
                    return DbColumnType.DATE;
                }
                return super.processTypeConvert(globalConfig, fieldType);
            }
        });

        // 包配置
        PackageConfig packageConfig = new PackageConfig();
        //         packageConfig.setModuleName(scanner("模块名"));
//         packageConfig.setModuleName(moduleName);
        String moduleName = scanner("模块名");
        packageConfig.setParent(packagePath);    //  包名
//        packageConfig.setController("controller." + moduleName);
        packageConfig.setEntity("pojo." + moduleName);
//        packageConfig.setXml("mapper"); //  Mapper.xml文件位置
//        packageConfig.setService("service." + moduleName);
//        packageConfig.setServiceImpl("service." + moduleName +".impl");
//        packageConfig.setMapper("dao." + moduleName);


        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // freemarker模板引擎
        String templatePath = "/templates/mapper.xml.ftl";
        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
//                return projectPath + "/src/main/resources/mapper/" + moduleName + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
                return projectPath + "/src/main/resources/mapper/" + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);  //  数据库表映射到实体的命名策略
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);    //  数据库表字段映射到实体的命名策略, 未指定按照 naming 执行
        strategy.setEntityLombokModel(true);    //  【实体】是否为lombok模型（默认 false）
        strategy.setRestControllerStyle(true);//生成 @RestController 控制器
//	     strategy.setInclude(scanner("user,payorder").split(","));
//	     strategy.setInclude(scanner("sys_handcard"));
        strategy.setInclude(scanner("表名，多个英文逗号分割").split(","));    // 表
        strategy.setControllerMappingHyphenStyle(true); //  驼峰转连字符
//	     strategy.setTablePrefix(packageConfig.getModuleName() + "_");//表前缀
        strategy.setTablePrefix(scanner("表前缀"));    //  表前缀
        strategy.setLogicDeleteFieldName("is_delete");   //      逻辑删除字段名
//         strategy.setEntityBooleanColumnRemoveIsPrefix(false);    //  去掉布尔值is_前缀
        strategy.setControllerMappingHyphenStyle(true);    //url中驼峰转连字符

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 代码生成器
        AutoGenerator generator = new AutoGenerator();
        generator.setGlobalConfig(globalConfig);    // 全局配置
        generator.setDataSource(dataSource);    //  数据源
        generator.setPackageInfo(packageConfig);    // 包配置
        generator.setCfg(cfg);  // 自定义配置
        generator.setTemplate(templateConfig);  // 配置模板
        generator.setStrategy(strategy);    //  策略配置
        generator.setTemplateEngine(new FreemarkerTemplateEngine());    //  模版引擎
        generator.execute();
    }

    public static void main(String[] args) {
        generator("system","com.guanyua.eims", "任建波");
    }

}
